// 创建 websocket.js文件
export default class WebsocketTask{
	constructor(url,time){
	   this.url = url
	   this.data = null
	   this.isOpenSocket = false
	   // 心跳检测
	   this.timeout = time
	   this.heartbeat = null
   
	   try{
		 return this.connectSocketInit()
	   }catch(e){
		 this.isOpenSocket = false
		 this.reconnect();
	   } 
	}
  
	connectSocketInit(){
	  this.socketTask = uni.connectSocket({
		url: this.url
	  })
  
	  this.socketTask.onOpen((res)=>{
		clearTimeout(this.heartbeat);
		this.isOpenSocket = true
		this.start();
		this.socketTask.onMessage((res)=>{
		   //接收消息
		})
	  })
  
	  this.socketTask.onClose(()=>{
		this.isOpenSocket = false;
		this.reconnect();
	  })
	}
  
	//发送消息
	send(data){
	  this.socketTask.send({
		 data,
	  })
	}
	//开启心跳检测
	start(){
	  this.heartbeat = setTimeout(()=>{
		 this.data = {value:'xx'}
		 this.send(JSON.stringify(this.data));
	  }, timeout)
	}
	// 重新连接
	reconnect(){
	 clearInterval(this.heartbeat)
	 if(!this.isOpenSocket){
	   setTimeout(()=>{
		  this.connectSocketInit();
	   }, 3000)
	 }
	}
  }
// let isSocketClose=false;    // 是否关闭socket
// let reconnectCount=5;    // 重连次数
// let heartbeatInterval="";   // 心跳定时器
// let socketTask = null;  // websocket对象

// let  againTimer = null;//断线重连定时器


// let url = null;
// let onReFn = null;
// let onSucFn = null;
// let onErrFn = null;

// /**
//  * sockeUrl：websocet的地址
//  * onReceive：消息监听的回调
//  * onErrorEvent：抛出错误的回调，且弹窗连接失败的提示框
//  * onErrorSucceed：抛出成功回调，主要用于隐藏连接失败的提示框
//  * */
// const sokcet= (sockeUrl,onReceive,onErrorEvent,onErrorSucceed)=> {
// 	           url = sockeUrl;
// 			   onReFn= onReceive;
// 			   onErrFn= onErrorEvent;
// 			   onSucFn= onErrorSucceed;
// 			   isSocketClose=false; 
// 	          //判断是否有websocet对象，有的话清空
// 	           if(socketTask){
// 				   socketTask.close();
// 				   socketTask = null;
// 				   clearInterval(heartbeatInterval);
// 			   }
	
// 			   //WebSocket的地址
// 				// 【非常重要】必须确保你的服务器是成功的,如果是手机测试千万别使用ws://127.0.0.1:9099【特别容易犯的错误】
// 				let url = sockeUrl
// 				// 连接
// 				socketTask = uni.connectSocket({
// 					url: url,
// 					success(data) {
// 								console.log("websocket连接成功");
// 								clearInterval(againTimer)//断线重连定时器
// 							},
// 					fail: (err) => {
// 						console.log("报错",err);
// 					}
// 				});
				
// 				// 连接打开
// 				socketTask.onOpen((res)=>{
// 					console.log('WebSocket打开');
// 					clearInterval(againTimer)//断线重连定时器
// 					 onErrorSucceed({isShow:false}) // 用于提示框的隐藏
// 					heartbeatInterval && clearInterval(heartbeatInterval);
// 					// 10秒发送一次心跳
// 					heartbeatInterval = setInterval(() => {
// 						sendMsg('心跳ing')
// 					}, 1000*5)
// 				})
// 				 // 监听连接失败
// 				socketTask.onError((err)=>{
// 					console.log('WebSocket连接打开失败，请检查',err);
// 					//停止发送心跳
// 					clearInterval(heartbeatInterval)
// 					//如果不是人为关闭的话，进行重连
// 					if (!isSocketClose) { 
// 						reconnect(url,onErrorEvent)
// 					}
// 				})
			 
// 				// // 监听连接关闭 -
// 				socketTask.onClose((e) => {
// 							console.log('WebSocket连接关闭！');
// 							clearInterval(heartbeatInterval)
// 							if (!isSocketClose) {
// 								reconnect(url,onErrorEvent)
// 							}
// 					})

// 				// 监听收到信息
// 				socketTask.onMessage((res) => {
// 						uni.hideLoading()
// 						console.log(res,'res监听收到信息')
// 						let serverData = res.data
// 						//与后端规定好返回值分别代表什么，写业务逻辑
// 						  serverData && onReceive(serverData);
// 				});
				
			
// }

// 	const reconnect = (url,onErrorEvent)=>{
// 				 console.log('进入断线重连',isSocketClose);
// 				     clearInterval(againTimer)//断线重连定时器
// 				     clearInterval(heartbeatInterval);
// 					 socketTask && socketTask.close(); // 确保已经关闭后再重新打开
// 					 socketTask = null;
// 					onErrorEvent({isShow:true,messge:'扫描头服务正在连接...'})
// 					// 连接  重新调用创建websocet方法
// 			againTimer	= setInterval(()=>{
// 					 sokcet(url,onReFn,onErrFn,onSucFn)
// 					 console.log('在重新连接中...');
// 				 },1000*5)
					
										
// 		}	

//   const sendMsg = (msg)=>{   //向后端发送命令
//                 msg = JSON.stringify(msg)
//                 try{
//                     //通过 WebSocket 连接发送数据
//                     socketTask.send({
//                         data: msg
//                     });
//                 }catch(e){
// 					if(isSocketClose){
// 						return
// 					}else{
// 						reconnect(url,onErrFn)
// 					}

//                 }
//             }
// // 关闭websocket【必须在实例销毁之前关闭,否则会是underfined错误】beforeDestroy() {websocetObj.stop();}
			
// const stop = ()=>{
// 	     isSocketClose = true
//         clearInterval(heartbeatInterval);
// 		clearInterval(againTimer)//断线重连定时器
// 		socketTask.close(); // 确保已经关闭后再重新打开
// 		socketTask = null;
// }

 

 
 
//  export const websocetObj = {
//  	sokcet,
//  	stop,
// 	sendMsg
//  };